home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2007 December / PCWKCD1207B.iso / Blogowanie poza sfera / Flock 1.0 beta / flock-1.0RC3.en-US.win32.exe / flock / components / flockSearchManager.js < prev    next >
Text File  |  2007-10-18  |  11KB  |  352 lines

  1. //
  2. // BEGIN FLOCK GPL
  3. // 
  4. // Copyright Flock Inc. 2005-2007
  5. // http://flock.com
  6. // 
  7. // This file may be used under the terms of of the
  8. // GNU General Public License Version 2 or later (the "GPL"),
  9. // http://www.gnu.org/licenses/gpl.html
  10. // 
  11. // Software distributed under the License is distributed on an "AS IS" basis,
  12. // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  13. // for the specific language governing rights and limitations under the
  14. // License.
  15. // 
  16. // END FLOCK GPL
  17. //
  18.  
  19. const FLOCK_SEARCH_MANAGER_CID      = Components.ID('{438ca78d-41b5-4831-8a93-c4fb5c346bde}');
  20.  
  21. const nsISupports                   = Components.interfaces.nsISupports;
  22. const nsIClassInfo                  = Components.interfaces.nsIClassInfo;
  23. const nsIFactory                    = Components.interfaces.nsIFactory;
  24. const nsIProperties                 = Components.interfaces.nsIProperties;
  25. const nsILocalFile                  = Components.interfaces.nsILocalFile;
  26. const nsIFile                       = Components.interfaces.nsIFile;
  27. const nsIIOService                  = Components.interfaces.nsIIOService;
  28. const nsIFileProtocolHandler        = Components.interfaces.nsIFileProtocolHandler;
  29. const nsIPreferenceService          = Components.interfaces.nsIPrefBranch;
  30. const nsIBrowserSearchService       = Components.interfaces.nsIBrowserSearchService
  31. const flockISearchManager           = Components.interfaces.flockISearchManager;
  32.  
  33.  
  34. const FLOCK_SEARCH_MANAGER_CONTRACTID = "@flock.com/search-manager;1";
  35. const DIRECTORY_SERVICE_CONTRACTID    = '@mozilla.org/file/directory_service;1';
  36. const LOCAL_FILE_CONTRACTID           = '@mozilla.org/file/local;1';
  37. const PREFERENCES_CONTRACTID          = '@mozilla.org/preferences-service;1';
  38. const IO_SERVICE_CONTRACTID           = '@mozilla.org/network/io-service;1';
  39. const SEARCH_SERVICE_CONTRACID        = '@mozilla.org/browser/search-service;1';
  40.  
  41. const SEARCHELSEWHERE_EXCLUSION_PREF  = "flock.search.excludedEngines";
  42. const LIVESEARCH_ENABLED_SVCS_PREF    = "flock.liveSearch.enabledServices";
  43. const LIVESEARCH_ORDERED_SVCS         = "flock.liveSearch.orderedServices";
  44.  
  45. const nsIRDFRemoteDataSource        = Components.interfaces.nsIRDFRemoteDataSource;
  46. const nsIRDFDataSource              = Components.interfaces.nsIRDFDataSource;
  47. const flockISearchService           = Components.interfaces.flockISearchService;
  48.  
  49. const nsIXMLHttpRequest             = Components.interfaces.nsIXMLHttpRequest;
  50. const XMLHTTPREQUEST_CONTRACTID     = '@mozilla.org/xmlextras/xmlhttprequest;1'
  51.  
  52. const flockIError = Components.interfaces.flockIError;
  53. const FLOCK_ERROR_CONTRACTID = '@flock.com/error;1'
  54. var SEARCH_API_URL = "";
  55.  
  56.  
  57. function flockSearchManager() {
  58.   debug('>> flockSearchManager is being constructed\n');
  59.   this.mName2ServiceMap = {};
  60.   this.mService2NameMap = {};
  61.   this.mPreferredServices = {};
  62.   this.mPrefService = Components.classes[PREFERENCES_CONTRACTID].getService(nsIPreferenceService);
  63.   this.mBrowserSearchService = Components.classes[SEARCH_SERVICE_CONTRACID].getService(nsIBrowserSearchService);
  64.     
  65.   var catmgr = Components.classes["@mozilla.org/categorymanager;1"]
  66.                          .getService (Components.interfaces.nsICategoryManager);
  67.   var enum = catmgr.enumerateCategory("flockISearchService");
  68.   while(enum.hasMoreElements()) {
  69.     try {
  70.       var obj = enum.getNext();
  71.       debug('>> flockSearchManager obj ' + obj +'\n');
  72.       var supportsString = obj.QueryInterface(Components.interfaces.nsISupportsCString);
  73.       var shortName = supportsString.toString();
  74.       var cid = catmgr.getCategoryEntry("flockISearchService", shortName);
  75.       var svc = Components.classes[cid].getService(Components.interfaces.flockISearchService);
  76.       this.registerAPI(svc, shortName);
  77.     } catch(e) {
  78.       debug('>>> EXCEPTION ' + e + '\n');
  79.     }
  80.   }
  81. }
  82.  
  83. flockSearchManager.prototype.mStates = {};
  84. flockSearchManager.prototype.mListeners = new Array();
  85.  
  86. flockSearchManager.prototype.addListener = function(aListener) {
  87.   if (aListener == null) {
  88.     throw  "Listener is null!!";
  89.   }
  90.   this.mListeners.push(aListener);
  91. }
  92.  
  93. flockSearchManager.prototype.removeListener = function(aListener) {
  94.   for(var i=0;i<this.mListeners.length;++i) {
  95.     if(aListener==this.mListeners[i]) {
  96.       this.mListeners.splice(i,1);
  97.       break;
  98.     }
  99.   }
  100. }
  101.  
  102. flockSearchManager.prototype.registerAPI = function(aService, aShortname) {
  103.   debug('registerAPI ' + aService + ' ' + aService.shortName +'\n');
  104.   this.mName2ServiceMap[aShortname] = aService;
  105.   this.mService2NameMap[aService] = aShortname;
  106. }
  107.  
  108. flockSearchManager.prototype.getServiceFromShortname = function(aShortname) {
  109.   return this.mName2ServiceMap[aShortname];
  110. }
  111.  
  112. flockSearchManager.prototype.__defineGetter__('services', function () { 
  113.   var ar = new Array();
  114.   for(var p in this.mName2ServiceMap) {
  115.     ar.push(this.mName2ServiceMap[p]);
  116.   }
  117.   return {
  118.     getNext: function() {
  119.       var rval = ar.shift();
  120.       return rval;
  121.     },
  122.     hasMoreElements: function() {
  123.       return (ar.length>0);
  124.     }
  125.   }
  126. })
  127.  
  128. flockSearchManager.prototype.__defineGetter__('orderedServices', function () { 
  129.   var orderedServices = this.getServicesInOrder();
  130.   if (!orderedServices.length) return this.services;
  131.   
  132.   var ar = [];
  133.   for (var i=0; i < orderedServices.length; i++) {
  134.     var svc = this.getServiceFromShortname(orderedServices[i]);
  135.     if (svc) {
  136.       ar.push(svc);
  137.     }
  138.   }
  139.   
  140.   return {
  141.     getNext: function() {
  142.       var rval = ar.shift();
  143.       return rval;
  144.     },
  145.     hasMoreElements: function() {
  146.       return (ar.length>0);
  147.     },
  148.   }
  149. })
  150.  
  151.  
  152. flockSearchManager.prototype.__defineGetter__('enabledServices', function () { 
  153.   var enabledList = this.getEnabledServices();
  154.   var ar = [];
  155.   
  156.   for (var i=0; i < enabledList.length; i++) {
  157.     var svc = this.getServiceFromShortname(enabledList[i]);
  158.     if (svc) {
  159.       ar.push(svc);
  160.     }
  161.   }
  162.   
  163.   return {
  164.     getNext: function() {
  165.       var rval = ar.shift();
  166.       debug('enabledServices '+ rval +'\n');
  167.       return rval;
  168.     },
  169.     hasMoreElements: function() {
  170.       return (ar.length>0);
  171.     },
  172.   }
  173. })
  174.  
  175.  
  176. flockSearchManager.prototype.__defineGetter__('searchElsewhereList', function () { 
  177.   var ar = this.getSearchElsewhereList();
  178.   return {
  179.     getNext: function() {
  180.       var rval = ar.shift();
  181.       return rval;
  182.     },
  183.     hasMoreElements: function() {
  184.       return (ar.length > 0);
  185.     }
  186.   };
  187. })
  188.  
  189.  
  190. flockSearchManager.prototype.getServicesInOrder = function () {
  191.   var pref = this.mPrefService.getPrefType(LIVESEARCH_ORDERED_SVCS);
  192.   if (pref) {
  193.     var pref = this.mPrefService.getCharPref(LIVESEARCH_ORDERED_SVCS);
  194.     var ar = pref.split(",");
  195.     var rval = new Array();
  196.     for(var i=0;i<ar.length;++i) {
  197.       if(ar[i].length) rval.push(ar[i]); 
  198.     }
  199.     return rval;
  200.   } else {
  201.     return new Array();
  202.   }
  203. }
  204.  
  205. flockSearchManager.prototype.getEnabledServices = function() {
  206.   try {
  207.     var pref = this.mPrefService.getCharPref("flock.liveSearch.enabledServices");
  208.     var ar = pref.split(",");
  209.     var rval = new Array();
  210.     for(var i=0;i<ar.length;++i) {
  211.       if(ar[i].length) rval.push(ar[i]); 
  212.     }
  213.     return rval;
  214.   } catch(e) {
  215.     debug(e);
  216.     return new Array();
  217.   }
  218. }
  219.  
  220.  
  221. flockSearchManager.prototype.isServiceEnabled = function(aShortName) {
  222.     try {
  223.        var pref = this.mPrefService.getCharPref(LIVESEARCH_ENABLED_SVCS_PREF);
  224.        var ar = pref.split(",");
  225.        for(var i=0;i<ar.length; i++) {
  226.            if (ar[i] == aShortName)
  227.             return true;
  228.        }
  229.        return false;
  230.     } catch (ex) {
  231.         debug (ex);
  232.         return false;
  233.     }
  234. }
  235.  
  236. flockSearchManager.prototype.search = function(aQuery, aNumResults, aListener, aDataSource) {
  237.   var enum = this.enabledServices;
  238.   var inst = this;
  239.   /*
  240.   var searchListener = {
  241.       foundResults: function(aNumResults, aDataSource, aServiceNameSource) {
  242.           //inst.notify(aNumResults, aDataSource, aServiceNameSource);
  243.           aListener.foundResults(aNumResults, aDataSource, aServiceNameSource);
  244.       }
  245.   }
  246.   */
  247.   while(enum.hasMoreElements()) {
  248.     var service = enum.getNext();
  249.     service.search(aQuery, aNumResults, /* searchListener */ aListener, aDataSource);
  250.     aListener.searchStarted(service.shortName)
  251.     //this.notifySearchStarted(service.shortName);
  252.   }
  253. }
  254.  
  255. flockSearchManager.prototype.getSearchElsewhereList = function() {
  256.   var pref = this.mPrefService.getCharPref(SEARCHELSEWHERE_EXCLUSION_PREF);
  257.   var engines = this.mBrowserSearchService.getEngines({ });
  258.   var retval = [];
  259.   for (var i = 0; i < engines.length; i++) {
  260.     if (pref.indexOf(engines[i].name) == -1) {
  261.       retval.push(engines[i]);
  262.     }
  263.   }
  264.   return retval;
  265. },
  266.  
  267. flockSearchManager.prototype.notifySearchStarted = function (aServiceNameSource) {
  268.   for(var i=0;i<this.mListeners.length;++i) {
  269.     this.mListeners[i].searchStarted(aServiceNameSource);
  270.   }
  271. }
  272.  
  273. flockSearchManager.prototype.notify = function (aNumResults, aDataSource, aServiceNameSource) {
  274.   for(var i=0;i<this.mListeners.length;++i) {
  275.       this.mListeners[i].foundResults(aNumResults, aDataSource, aServiceNameSource);
  276.     }
  277. }
  278.  
  279. flockSearchManager.prototype.setEnabledServices = function(aArray) {
  280.     var val = aArray.join(",");
  281.     var pref = this.mPrefService.setCharPref("flock.search.flyout.enabledServices", val);
  282. }
  283.  
  284. flockSearchManager.prototype.flags = nsIClassInfo.SINGLETON;
  285. flockSearchManager.prototype.classDescription = "Flock Search Manager Service";
  286. flockSearchManager.prototype.getInterfaces = function (count) {
  287.     var interfaceList = [flockISearchManager, nsIClassInfo];
  288.     count.value = interfaceList.length;
  289.     return interfaceList;
  290. }
  291.  
  292. flockSearchManager.prototype.getHelperForLanguage = function (count) {return null;}
  293.  
  294. flockSearchManager.prototype.QueryInterface =
  295. function (iid) {
  296.     if (!iid.equals(flockISearchManager) && 
  297.         !iid.equals(nsIClassInfo) &&
  298.         !iid.equals(nsISupports))
  299.         throw Components.results.NS_ERROR_NO_INTERFACE;
  300.     return this;
  301. }
  302.  
  303. // Module implementation
  304. var FlockSearchModule = new Object();
  305.  
  306. FlockSearchModule.registerSelf =
  307. function (compMgr, fileSpec, location, type)
  308. {
  309.     compMgr = compMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
  310.  
  311.     compMgr.registerFactoryLocation(FLOCK_SEARCH_MANAGER_CID, 
  312.                                     "Flock Search Manager JS Component",
  313.                                     FLOCK_SEARCH_MANAGER_CONTRACTID, 
  314.                                     fileSpec, 
  315.                                     location,
  316.                                     type);
  317. }
  318.  
  319. FlockSearchModule.getClassObject =
  320. function (compMgr, cid, iid) {
  321.     if (!cid.equals(FLOCK_SEARCH_MANAGER_CID))
  322.         throw Components.results.NS_ERROR_NO_INTERFACE;
  323.     
  324.     if (!iid.equals(Components.interfaces.nsIFactory))
  325.         throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
  326.     
  327.     return FlockSearchManagerFactory;
  328. }
  329.  
  330. FlockSearchModule.canUnload =
  331. function(compMgr)
  332. {
  333.     return true;
  334. }
  335.     
  336. /* factory object */
  337. var FlockSearchManagerFactory = new Object();
  338.  
  339. FlockSearchManagerFactory.createInstance =
  340. function (outer, iid) {
  341.     if (outer != null)
  342.         throw Components.results.NS_ERROR_NO_AGGREGATION;
  343.  
  344.     return (new flockSearchManager()).QueryInterface(iid);
  345. }
  346.  
  347. /* entrypoint */
  348. function NSGetModule(compMgr, fileSpec) {
  349.     return FlockSearchModule;
  350. }
  351.  
  352.